/**
 * GIS 地图功能封装
 */

// 百度地图对象
var map = null
// 百度测距插件
var myDis = null
// 保存marker->站点对象映射
var markerSiteMap = {}

// 所有站点集合
var siteOverlays = new Set()
// 所有光缆覆盖物集合
var opticalCableOverlays = new Set()
// 多边形覆盖物
var areaOverlays = new Set()

// 需要将当前地图页面的坐标返回给原页面的坐标数据对象
var gisInfo = {
    x: '',
    y: ''
}

var calbeGisInfo = [];
/**
 * 返回选中坐标点信息
 */
function getGisInfo () {
    if (myDis) {
        myDis.close()
    }
    return gisInfo
}

/**
 * 打开测距工具
 */
function openGisPicker () {
    if (myDis) {
        myDis.open()
    }
}

/**
 * 设置区域的边界多边形
 */
function initAreaBoundary () {
    // 颜色映射对象（赤橙黄绿青蓝紫）
    var colorMap = ['#FF0000', '#FF7F00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#8B00FF']
    var i = 0
    for (var key in citys) {
        var city = citys[key]
        if (city.coordinates) {
            // ---  边界坐标值数组
            var boundaryPointsArr = city.coordinates[0][0]
            var _fillColor = colorMap[i % 7]
            /* 行政区划 */
            var pointArray = []
            boundaryPointsArr.forEach(e => {
                pointArray.push(new BMap.Point(e[0], e[1]))
            })
            if (pointArray && pointArray.length > 0) {
                // 建立区县的多边形覆盖物
                // var cityBoundaryPolygon = new BMap.Polygon(pointArray, {
                //     strokeWeight: 3, strokeColor: _fillColor, fillColor: _fillColor, fillOpacity: 0.2
                // })
                var cityBoundaryPolygon = new BMap.Polygon(pointArray, {
                    strokeWeight: 1, strokeColor: '#47515b', fillColor: _fillColor, fillOpacity: 0.1, strokeOpacity: 0.3
                })
                // console.log(cityBoundaryPolygon.getZIndex())
                // cityBoundaryPolygon.setZIndex(cityBoundaryPolygon.getZIndex() + i * 2);
                areaOverlays.add(cityBoundaryPolygon)
                // 添加多边形覆盖物
                map.addOverlay(cityBoundaryPolygon)
            }
        }
        i = i + 1
    }
}

// 初始化GisInfo信息
function initOpticalCableLines (opticalCableArr) {
    if (!opticalCableArr || opticalCableArr.length === 0) {
        return
    }
    // 光缆遍历处理坐标点划线
    opticalCableArr.forEach(function (opticalCable) {
        var gisInfo = opticalCable.gisInfo
        if (!opticalCable || !gisInfo) {
            return
        }
        var pointArray = []
        var gisInfoArr = gisInfo.split(';')
        gisInfoArr.forEach(e => {
            var gisArr = e.split(',')
            pointArray.push(new BMap.Point(gisArr[0], gisArr[1]))
        })
        if (pointArray && pointArray.length > 0) {
            var ply = new BMap.Polyline(pointArray, { strokeColor: '#8B00FF', strokeWeight: 2 })
            opticalCableOverlays.add(ply)
            map.addOverlay(ply)
        }
    })
}

/**
 * 设置站点标注Markers
 * @param siteArr
 */
function initSiteMarkers (siteArr) {
    if (siteArr && siteArr.length > 0) {
        var buildSiteLabel = function (content) {
            var labelStyle = {
                textAlign: 'center',
                color: '#fff',
                backgroundColor: '#333333',
                border: '3',
                fontSize: '14px',
                minWidth: '100px',
                opacity: '0.8',
                verticalAlign: 'center',
                borderRadius: '2px',
                whiteSpace: 'normal',
                wordWrap: 'break-word',
                padding: '7px'
            }
            // 用于设置样式
            var spanA = "<span class='angle'><span>"
            var label = new BMap.Label(content + spanA, {
                offset: new BMap.Size(-20, -40)
            })
            label.setStyle(labelStyle)
            return label
        }

        siteArr.forEach(site => {
            // 站点GIS坐标
            var gisInfo = site.gisInfo
            // 站点名称
            var siteName = site.name
            // 设置站点名称和站点对象关联
            markerSiteMap[siteName] = site
            // 搜索Label，看是否已经添加，如果已经添加，则不添加Label，确保不重复添加同名站点名称
            var gisArr = gisInfo.split(',')
            // 地图坐标点对象
            var point = new BMap.Point(gisArr[0], gisArr[1])
            // 地图标注对象
            var marker = new BMap.Marker(point)
            marker.setLabel(buildSiteLabel(siteName))

            // 页面转向的消息触发
            var notifyTurnToPage = function (roomType) {
                return function (lngLat, xy, marker) {
                    window.postMessage({ type: roomType || '2d', code: markerSiteMap[marker.getTitle()].code }, '*')
                }
            }

            // 创建右键菜单上下文
            var markerMenu = new BMap.ContextMenu()
            // 右键下来的2D机房选项
            var room2dItem = new BMap.MenuItem("<span>2D机房&nbsp;&nbsp;<img src='/static/bmap/images/2d.png' /></span>", notifyTurnToPage('2d').bind(marker))
            // 右键下来的3D机房选项
            var room3dItem = new BMap.MenuItem("<span>3D机房&nbsp;&nbsp;<img src='/static/bmap/images/3d.png' /></span>", notifyTurnToPage('3d').bind(marker))
            // 添加右键菜单项(2D机房)
            markerMenu.addItem(room2dItem)
            // 添加右键菜单项(3D机房)
            markerMenu.addItem(room3dItem)
            // 设置标注marker的上下文
            marker.addContextMenu(markerMenu)
            // 设置marker的站点名称
            marker.setTitle(siteName)

            siteOverlays.add(marker)
            // 添加标注marker
            map.addOverlay(marker)
        })
    }
}

/**
 * 初始化百度地图
 */
function initBmap () {
    map = new BMap.Map('container', { minZoom: 10, maxZoom: 16 }) // 创建Map实例
    // 创建中心点BMap.Point对象
    var centerPoint = new BMap.Point(117.010716, 30.538422)
    // 设置地图中心点
    map.centerAndZoom(centerPoint, 10)
    // 滚轮缩放
    map.enableScrollWheelZoom()
    // 设置地图类型为常规2DGIS地图
    map.addControl(new BMap.MapTypeControl({ mapTypes: [BMAP_NORMAL_MAP] }))
    // try {
    //     BMapLib.AreaRestriction.setBounds(map, new BMap.Bounds(new BMap.Point(115.70326000,31.27582200),new BMap.Point(117.87874000,29.81082000))); // 已map为中心，已b为范围的地图
    // } catch (e) {
    //     // 捕获错误异常
    //     console.log(e)
    // }
}

/**
 * 定位到坐标点
 * @pparam position 坐标点数组
 */
function locateTo (position) {
    if (position && position.length === 2 && map) {
        var newPoint = new BMap.Point(position[0], position[1])
        map.setZoom(12)
        map.panTo(newPoint)
    }
}

/**
 * 切换元素隐藏显示
 * @type {Array}
 */
function switchShow (opt) {
    if (opt && opt.type) {
       if (opt.type === 'site') {
         siteOverlays.forEach(site => {
            if (opt.flag) {
                site.show()
            } else {
                site.hide()
            }
         })
       }
       if (opt.type === 'opticalCable') {
           opticalCableOverlays.forEach(opticalCable => {
               if (opt.flag) {
                   opticalCable.show()
               } else {
                   opticalCable.hide()
               }
           })
       }
    }
}

// 标注缓存数组（用于判断清除前面选中位置）
var markersCache = []
function initSelectedPoint () {
    map.addEventListener('tilesloaded', function () {
        var styleOptions = {
            strokeColor: 'red', // 边线颜色。
            fillColor: 'red', // 填充颜色。当参数为空时，圆形将没有填充效果。
            strokeWeight: 3, // 边线的宽度，以像素为单位。
            strokeOpacity: 0.8, // 边线透明度，取值范围0 - 1。
            fillOpacity: 0.6, // 填充的透明度，取值范围0 - 1。
            strokeStyle: 'solid' // 边线的样式，solid或dashed。
        }

        // 实例化鼠标绘制工具
        var drawingManager = new BMapLib.DrawingManager(map, {
            isOpen: true, // 是否开启绘制模式
            enableDrawingTool: true, // 是否显示工具栏
            enableCalculate: false,
            drawingToolOptions: {
                anchor: BMAP_ANCHOR_TOP_RIGHT, // 位置
                offset: new BMap.Size(5, 5), // 偏离值
                drawingModes: [BMAP_DRAWING_MARKER]
            },
            drawingTypes: [
                BMAP_DRAWING_MARKER
            ],
            circleOptions: styleOptions // 圆的样式
        })

        var overlaycomplete = function (e, overlay) {
            // 清除前一个选中坐标点，方便选择
            if (markersCache && markersCache.length > 0) {
                markersCache.forEach(m => {
                    // 清除以前缓存的overlays
                    map.removeOverlay(m)
                })
            }
            // 添加新的overlay
            markersCache.push(overlay)
            // 坐标获取
            gisInfo.x = overlay.point.lng
            gisInfo.y = overlay.point.lat
        }

        // 添加鼠标绘制工具监听事件，用于获取绘制结果
        drawingManager.addEventListener('markercomplete', overlaycomplete)
        // 设置鼠标绘制模式为绘制标注点
        drawingManager.setDrawingMode(BMAP_DRAWING_MARKER)
    })
}

/**
 * 初始化测距工具（用于画折线）
 */
function initDistanceTool () {
    myDis = new BMapLib.DistanceTool(map)
    myDis.addEventListener('drawend', function (e) {
        var tmpPoints = e.points
        if (tmpPoints && tmpPoints.length > 0) {
            var points = tmpPoints.map(point => point.lng + ',' + point.lat).reduce((previousValue, currentValue) => {
                return previousValue + ';' + currentValue
            })
            gisInfo.points = points
        }
    })
    myDis.open()
}

/**
 * 清除原来光缆连线
 */
function clearOpticalCableLines(){
    if (opticalCableOverlays && opticalCableOverlays.size>0) {
        opticalCableOverlays.forEach((oc)=>{
            map.removeOverlay(oc);
        });
    }
}
/**
 * 离线地图全局初始化
 * @param opts 初始化传入参数(例如站点信息、光缆信息等)
 */
function initialize (opts) {
    // 设置百度离线地图
    initBmap()
    // 设置区县区域的边界多边形
    initAreaBoundary()
    // 如果传入参数,则进行更多的地图设置
    if (opts) {
        // 设置光缆连线
        initOpticalCableLines(opts.opticalCableArr)
        // 设置站点标注Markers
        initSiteMarkers(opts.siteArr)

        // 启用选中点坐标
        if (opts.enableSelectedPoint) {
            initSelectedPoint()
        }

        // 启用测距工具
        if (opts.enableDistanceTool) {
            initDistanceTool()
        }

        if (opts.opticalCable) {
            // 需要异步延迟防止阻塞展示
            setTimeout(() => {
                // 先隐藏清除原来的对象
                clearOpticalCableLines();
                initOpticalCableLines([opts.opticalCable])
            },500)
        }
    }
}
